package org.javahispano.javacup.tacticas_aceptadas.rudeboy.chimbitaFinal;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;

public class ChimbitaJugador {

	static Set<Integer> marcadosRival = new HashSet<Integer>();

	Posicion corroAlVacio = null;
	int iteracionesCorriendoAlVacio = 0;

	JugadorDetalle detalle;
	Posicion posMaxSupDer;
	Posicion posMinInfIzq;
	int idx;

	Posicion puntoCorroSinBalonDefensa;
	Posicion puntoCorroSinBalonAtaque;
	int marcando = -1;
	Posicion[] puntosPase = new Posicion[] {};
	int[] jugadoresPase = new int[]{};
	boolean acompanaAtacante = false;

	public ChimbitaJugador(JugadorDetalle detalle, 
			Posicion posMaxSupDer,
			Posicion posMinInfIzq, 
			int idx,
			Posicion puntoCorroSinBalonDefensa,
			Posicion puntoCorroSinBalonAtaque, 
			Posicion[] puntosPase,
			int[] jugadoresPase,
			boolean acompanaAtacante) {
		marcadosRival = new HashSet<Integer>();
		this.detalle = detalle;
		this.posMaxSupDer = posMaxSupDer;
		this.posMinInfIzq = posMinInfIzq;
		this.idx = idx;
		this.puntoCorroSinBalonDefensa = puntoCorroSinBalonDefensa;
		this.puntoCorroSinBalonAtaque = puntoCorroSinBalonAtaque;
		this.puntosPase = puntosPase;
		this.jugadoresPase = jugadoresPase;
		this.acompanaAtacante = acompanaAtacante;
	}

	public boolean puedoPatear(SituacionPartido sp) {
		int[] miosRematan = sp.puedenRematar();
		for (int h = 0; h < miosRematan.length; h++) {
			if (miosRematan[h] == idx) {
				return true;
			}
		}
		return false;
	}
	
	public boolean balonEnMiCuadrante(Posicion balon) {
		return ((balon.getX() >= this.posMinInfIzq.getX() && balon.getX() < this.posMaxSupDer
				.getX())
				&& balon.getY() >= this.posMinInfIzq.getY() && balon.getY() < this.posMaxSupDer
				.getY());
	}

	public Posicion mejorPosicionIr(Posicion balonAct, Posicion balonPas) {
//		if (acompa�aAtacante && balonAct.getY() > 0d){
//			if (puntoCorroSinBalonAtaque.getX() < 0	){
//				return new Posicion(Ayudativo.HL.getX(), balonAct.getY() + 5).setDentroCampoJuego();
//			}else{
//				return new Posicion(Ayudativo.HR.getX(), balonAct.getY() + 5).setDentroCampoJuego();
//			}
//		}
		Posicion ideal = Posicion.Interseccion(balonAct, balonPas,
				this.puntoCorroSinBalonAtaque, new Posicion(
						puntoCorroSinBalonAtaque.getX() + 2,
						puntoCorroSinBalonAtaque.getY()));
		if (ideal != null && balonEnMiCuadrante(ideal)) {
			return ideal;
		}
		return puntoCorroSinBalonAtaque;
	}

	public Posicion buscarBalon() {
		if (corroAlVacio != null && iteracionesCorriendoAlVacio < 15) {
			iteracionesCorriendoAlVacio++;
			return corroAlVacio;
		}
		return null;
	}

	public List<Comando> mejorPosicionPasar(SituacionPartido sp, int arquero) {
		List<Comando> ret = new ArrayList<Comando>();
		boolean golpe = false;
		Posicion dondeEstoyYo = sp.misJugadores()[idx];
		if (dondeEstoyYo.distancia(Constantes.centroArcoSup) < 24d){
			if (dondeEstoyYo.distancia(Constantes.centroArcoSup) < 15d){
				Posicion pegue = new Posicion(Constantes.posteDerArcoSup.getX(), Constantes.posteDerArcoSup.getY() + 0.5 );
				if(sp.balon().getX()>0){
					pegue = new Posicion(Constantes.posteIzqArcoSup.getX(), Constantes.posteDerArcoSup.getY() + 0.5 );
				}
				ret.add(new ComandoGolpearBalon(idx, pegue, 0.7, false));
			}
			Posicion posdis = Ayudativo.getPosicionDisparo(sp.balon(), sp.rivales()[arquero]);
			double fuerza =  Ayudativo.obtenerFuerzaGolpe(sp.misJugadores()[idx], posdis,
					this.detalle);
			if (fuerza <= 1d){
				ret.add(Ayudativo.dispararAlArco(idx, sp.rivales()[arquero], sp));
				//ret.add(new ComandoGolpearBalon(idx,posdis , fuerza, 45));
			}else{
				ret.add(Ayudativo.dispararAlArco(idx, sp.rivales()[arquero], sp));
			}
		}else if(dondeEstoyYo.distancia(Constantes.centroArcoInf) < 24d){
			ret.add(new ComandoGolpearBalon(idx,
					sp.balon().getX()>0?Ayudativo.E:Ayudativo.D, 1, 35));
		}else{
			Posicion mejorJugadorMio = null;
			int mejorIdxMio = Integer.MAX_VALUE;
			int idxMejor = -1;
			for (int pase : jugadoresPase){
				int aux = Ayudativo.rivalesCercanos(sp.misJugadores()[pase], sp);
				if (aux < mejorIdxMio && aux < 2 && sp.misJugadores()[pase].distancia(sp.misJugadores()[idx]) > 7d
						&& sp.misJugadores()[pase].getY() > sp.misJugadores()[idx].getY() - 5d){
					double fuerza = Ayudativo.obtenerFuerzaGolpe(sp.misJugadores()[idx], sp.misJugadores()[pase],
							this.detalle);
					if (fuerza <= 1d){
						mejorIdxMio = aux;
						mejorJugadorMio = sp.misJugadores()[pase];
						idxMejor = pase;
					}
				}
			}
			if (mejorJugadorMio != null){
				double fuerza = Ayudativo.obtenerFuerzaGolpe(sp.misJugadores()[idx], mejorJugadorMio,
						this.detalle);
				if (fuerza < 1d){
					ret.add(new ComandoGolpearBalon(idx, mejorJugadorMio, fuerza, 45));
					ret.add(new ComandoIrA(idxMejor, mejorJugadorMio));
					ChimbitaTacticaFinal.cracks[idxMejor ].corroAlVacio = mejorJugadorMio;
					ChimbitaTacticaFinal.cracks[idxMejor].iteracionesCorriendoAlVacio = 0;
					golpe = true;
				}
			}
			if (!golpe){
				for (Posicion posicion : puntosPase) {
					int corre = Ayudativo.posicionMia(posicion, sp);
					if (!golpe && posicion.getY() > sp.balon().getY() && corre > 0) {
						if (dondeEstoyYo.distancia(sp.rivales()[dondeEstoyYo.indiceMasCercano(sp.rivales())]) < 13d ){
							double fuerza = Ayudativo.obtenerFuerzaGolpe(sp.misJugadores()[idx], posicion,
									this.detalle);
							if (fuerza > 1d){
								continue;
							}else{
								ret.add(new ComandoGolpearBalon(idx, posicion, fuerza, 45));
							}
						}else{
							ret.add(new ComandoGolpearBalon(idx));
							ret.add(new ComandoIrA(idx, posicion));
						}
						ret.add(new ComandoIrA(corre, posicion));
						ChimbitaTacticaFinal.cracks[corre ].corroAlVacio = posicion;
						ChimbitaTacticaFinal.cracks[corre ].iteracionesCorriendoAlVacio = 0;
						golpe = true;
						
					}
				}
			}
			if (!golpe) {
				if (dondeEstoyYo.distancia(sp.rivales()[dondeEstoyYo.indiceMasCercano(sp.rivales())]) < 8d ){
					ret.add(Ayudativo.dispararAlArco(idx, sp.rivales()[arquero], sp));
				}else{
					ret.add(new ComandoGolpearBalon(idx));
					ret.add(new ComandoIrA(idx, Constantes.centroArcoSup));
				}
			}
		}
		return ret;
	}

	public int aQuienMarco(SituacionPartido sp) {
		if (marcando > -1
				&& this.balonEnMiCuadrante(sp.rivales()[this.marcando])) {
			ChimbitaJugador.marcadosRival.add(marcando);
			return this.marcando;
		}
		ChimbitaJugador.marcadosRival.remove(marcando);
		int[] suyos = Constantes.centroArcoInf.indicesMasCercanos(sp.rivales());
		for (int h = 0; h < suyos.length; h++) {
			if (!ChimbitaJugador.marcadosRival.contains(suyos[h])
					&& balonEnMiCuadrante(sp.rivales()[suyos[h]])) {
				marcadosRival.add(suyos[h]);
				return suyos[h];
			}
		}
		return -1;
	}

}
